# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/10 11:28 
@Author  : ZhangShenao 
@File    : simple.py 
@Desc    : 简单的装饰器

装饰器的本质就是一个Closure闭包
它接收一个函数作为参数,返回一个新的函数
这个新的函数对原函数进行了包装,织入了一些增强的逻辑

所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改
装饰器是一种AOP编程思想

在实际工作中,装饰器通常运用在身份认证、日志记录、输入合理性检查以及缓存等多个领域中
合理使用装饰器,往往能极大地提高程序的可读性以及运行效率
"""


def simple_decorator(f):
    """简单装饰器实现"""

    # 使用*args和**kwargs,可以接收任意数量的参数
    def wrapper(*args, **kwargs):
        # 在调用原函数之前,织入一些逻辑
        print('before invoke origin function')

        # 调用原函数
        f(*args, **kwargs)

        # 在调用原函数之后,织入一些逻辑
        print('after invoke origin function')

    return wrapper


def greeting(name: str):
    print(f'Hello: {name}')


@simple_decorator
def greeting_with_decorator(name: str):
    """可以通过@语法糖,更方便地使用装饰器"""
    print(f'Hello: {name}')


if __name__ == '__main__':
    # 使用装饰器
    # 装饰器的本质就是传入一个function,获取一个被装饰后的function
    greeting_func = simple_decorator(greeting)
    # 调用被装饰后的函数
    greeting_func('zsa')

    # 使用装饰器语法糖
    # 因为装饰器定义了*args, **kwargs,因此被装饰的函数可以传递任意数量的参数
    greeting_with_decorator('zsa')
